<!DOCTYPE html>
<html lang="zh-cn">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <title>HTTP协议(转) - vzvixb</title>
  <meta name="renderer" content="webkit" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>

<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />

<meta name="theme-color" content="#f8f5ec" />
<meta name="msapplication-navbutton-color" content="#f8f5ec">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="#f8f5ec">


<meta name="author" content="even" /><meta name="description" content="http介绍 HTTP协议是Hyper Text Transfer Protocol（超文本传输协议）的缩写, 是用于从万维网（WWW:World Wide Web ）服务器传输超文本到本地浏览器的传送协议。 HTTP是一个基于TCP/IP通信协议来传递数据（HTML 文件, 图片文件, 查询结果等）。 HTTP是一个属于应用层的面向对象的协议，由于其简捷、快速的方式，适用于分布式超媒体信息系统。 它于1990年提出，经过几年的使用与发展，得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版， HTTP/1.1的规范化工作正在进行之中，而且HTTP-NG(Next Generation of HTTP)的建议已经提出。 HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。 Web服务器根据接收到的请求后，向客户端发送响应信息。
" /><meta name="keywords" content="Hugo, theme, even" />






<meta name="generator" content="Hugo 0.90.1 with theme even" />


<link rel="canonical" href="https://zhouxiaoxin.gitee.io/post/1/http%E5%8D%8F%E8%AE%AE%E8%BD%AC/" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/manifest.json">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">

<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>

<link href="/sass/main.min.32d4dc642fec98c34c80bebb9c784c50771712b4a8a25d9f4dd9cce3534b426e.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.1.20/dist/jquery.fancybox.min.css" integrity="sha256-7TyXnr2YU040zfSP+rEcz29ggW4j56/ujTPwjMzyqFY=" crossorigin="anonymous">


<meta property="og:title" content="HTTP协议(转)" />
<meta property="og:description" content="http介绍
HTTP协议是Hyper Text Transfer Protocol（超文本传输协议）的缩写,
是用于从万维网（WWW:World Wide Web ）服务器传输超文本到本地浏览器的传送协议。
HTTP是一个基于TCP/IP通信协议来传递数据（HTML 文件, 图片文件, 查询结果等）。
HTTP是一个属于应用层的面向对象的协议，由于其简捷、快速的方式，适用于分布式超媒体信息系统。
它于1990年提出，经过几年的使用与发展，得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版，
HTTP/1.1的规范化工作正在进行之中，而且HTTP-NG(Next Generation of HTTP)的建议已经提出。
HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
Web服务器根据接收到的请求后，向客户端发送响应信息。" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://zhouxiaoxin.gitee.io/post/1/http%E5%8D%8F%E8%AE%AE%E8%BD%AC/" /><meta property="article:section" content="post" />
<meta property="article:published_time" content="2017-10-16T16:04:00+00:00" />
<meta property="article:modified_time" content="2017-10-16T16:04:00+00:00" />

<meta itemprop="name" content="HTTP协议(转)">
<meta itemprop="description" content="http介绍
HTTP协议是Hyper Text Transfer Protocol（超文本传输协议）的缩写,
是用于从万维网（WWW:World Wide Web ）服务器传输超文本到本地浏览器的传送协议。
HTTP是一个基于TCP/IP通信协议来传递数据（HTML 文件, 图片文件, 查询结果等）。
HTTP是一个属于应用层的面向对象的协议，由于其简捷、快速的方式，适用于分布式超媒体信息系统。
它于1990年提出，经过几年的使用与发展，得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版，
HTTP/1.1的规范化工作正在进行之中，而且HTTP-NG(Next Generation of HTTP)的建议已经提出。
HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
Web服务器根据接收到的请求后，向客户端发送响应信息。"><meta itemprop="datePublished" content="2017-10-16T16:04:00+00:00" />
<meta itemprop="dateModified" content="2017-10-16T16:04:00+00:00" />
<meta itemprop="wordCount" content="8624">
<meta itemprop="keywords" content="HTTP,转载文章," /><meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="HTTP协议(转)"/>
<meta name="twitter:description" content="http介绍
HTTP协议是Hyper Text Transfer Protocol（超文本传输协议）的缩写,
是用于从万维网（WWW:World Wide Web ）服务器传输超文本到本地浏览器的传送协议。
HTTP是一个基于TCP/IP通信协议来传递数据（HTML 文件, 图片文件, 查询结果等）。
HTTP是一个属于应用层的面向对象的协议，由于其简捷、快速的方式，适用于分布式超媒体信息系统。
它于1990年提出，经过几年的使用与发展，得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版，
HTTP/1.1的规范化工作正在进行之中，而且HTTP-NG(Next Generation of HTTP)的建议已经提出。
HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
Web服务器根据接收到的请求后，向客户端发送响应信息。"/>

<!--[if lte IE 9]>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/classlist/1.1.20170427/classList.min.js"></script>
<![endif]-->

<!--[if lt IE 9]>
  <script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
<![endif]-->

</head>
<body>
  <div id="mobile-navbar" class="mobile-navbar">
  <div class="mobile-header-logo">
    <a href="/" class="logo">Even</a>
  </div>
  <div class="mobile-navbar-icon">
    <span></span>
    <span></span>
    <span></span>
  </div>
</div>
<nav id="mobile-menu" class="mobile-menu slideout-menu">
  <ul class="mobile-menu-list">
    <a href="/">
        <li class="mobile-menu-item">Home</li>
      </a><a href="/post/">
        <li class="mobile-menu-item">Archs</li>
      </a><a href="/tags/">
        <li class="mobile-menu-item">Tags</li>
      </a><a href="/categories/">
        <li class="mobile-menu-item">Cates</li>
      </a><a href="/about/">
        <li class="mobile-menu-item">About</li>
      </a><a href="/pages/runoob/">
        <li class="mobile-menu-item">runoob</li>
      </a><a href="/pages/98wubi/">
        <li class="mobile-menu-item">98wubi</li>
      </a>
  </ul>
</nav>
  <div class="container" id="mobile-panel">
    <header id="header" class="header">
        <div class="logo-wrapper">
  <a href="/" class="logo">Even</a>
</div>

<nav class="site-navbar">
  <ul id="menu" class="menu">
    <li class="menu-item">
        <a class="menu-item-link" href="/">Home</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/post/">Archs</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/tags/">Tags</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/categories/">Cates</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/about/">About</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/pages/runoob/">runoob</a>
      </li><li class="menu-item">
        <a class="menu-item-link" href="/pages/98wubi/">98wubi</a>
      </li>
  </ul>
</nav>
    </header>

    <main id="main" class="main">
      <div class="content-wrapper">
        <div id="content" class="content">
          <article class="post">
    
    <header class="post-header">
      <h1 class="post-title">HTTP协议(转)</h1>

      <div class="post-meta">
        <span class="post-time"> 2017-10-16 </span>
        <div class="post-category">
            <a href="/categories/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/"> 网络协议 </a>
            </div>
          <span class="more-meta"> 约 8624 字 </span>
          <span class="more-meta"> 预计阅读 18 分钟 </span>
        <span id="busuanzi_container_page_pv" class="more-meta"> <span id="busuanzi_value_page_pv"><img src="/img/spinner.svg" alt="spinner.svg"/></span> 次阅读 </span>
      </div>
    </header>

    <div class="post-toc" id="post-toc">
  <h2 class="post-toc-title">文章目录</h2>
  <div class="post-toc-content">
    <nav id="TableOfContents">
  <ul>
    <li><a href="#http介绍">http介绍</a></li>
    <li><a href="#特点">特点</a></li>
    <li><a href="#http中url">HTTP中URL</a></li>
    <li><a href="#uri和url的区别">URI和URL的区别</a>
      <ul>
        <li><a href="#uri">URI:</a></li>
        <li><a href="#url">URL:</a></li>
        <li><a href="#urn">URN:</a></li>
        <li><a href="#区别">区别：</a></li>
      </ul>
    </li>
    <li><a href="#http之请求消息request">HTTP之请求消息Request</a></li>
    <li><a href="#http之响应消息response">HTTP之响应消息Response</a></li>
    <li><a href="#http之状态码">HTTP之状态码</a></li>
    <li><a href="#http请求方法">HTTP请求方法</a></li>
    <li><a href="#http工作原理">HTTP工作原理</a></li>
    <li><a href="#get和post请求的区别">GET和POST请求的区别</a>
      <ul>
        <li><a href="#get请求">GET请求:</a></li>
        <li><a href="#post请求">POST请求:</a></li>
        <li><a href="#提交">提交</a></li>
        <li><a href="#get和post的区别">GET和POST的区别</a></li>
      </ul>
    </li>
    <li><a href="#有状态的web应用">有状态的WEB应用</a>
      <ul>
        <li><a href="#会话session">会话（session）</a></li>
        <li><a href="#cookies">Cookies</a></li>
        <li><a href="#ajax">AJAX</a></li>
      </ul>
    </li>
    <li><a href="#https安全">HTTPS安全</a></li>
    <li><a href="#推荐">推荐：</a></li>
  </ul>
</nav>
  </div>
</div>
    <div class="post-content">
      <h2 id="http介绍">http介绍</h2>
<p>HTTP协议是Hyper Text Transfer Protocol（超文本传输协议）的缩写,
是用于从万维网（WWW:World Wide Web ）服务器传输超文本到本地浏览器的传送协议。
HTTP是一个基于TCP/IP通信协议来传递数据（HTML 文件, 图片文件, 查询结果等）。
HTTP是一个属于应用层的面向对象的协议，由于其简捷、快速的方式，适用于分布式超媒体信息系统。
它于1990年提出，经过几年的使用与发展，得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版，
HTTP/1.1的规范化工作正在进行之中，而且HTTP-NG(Next Generation of HTTP)的建议已经提出。
HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
Web服务器根据接收到的请求后，向客户端发送响应信息。</p>
<h2 id="特点">特点</h2>
<ul>
<li>简单快速：客户向服务器请求服务时，只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单，使得HTTP服务器的程序规模小，因而通信速度很快。</li>
<li>灵活：HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。</li>
<li>无连接：无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求，并收到客户的应答后，即断开连接。采用这种方式可以节省传输时间。</li>
<li>无状态：HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息，则它必须重传，这样可能导致每次连接传送的数据量增大。另一方面，在服务器不需要先前信息时它的应答就较快。</li>
<li>支持B/S及C/S模式。</li>
</ul>
<h2 id="http中url">HTTP中URL</h2>
<p>HTTP使用统一资源标识符（Uniform Resource Identifiers, URI）来传输数据和建立连接。URL是一种特殊类型的URI，包含了用于查找某个资源的足够的信息</p>
<p>URL,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。以下面这个URL为例，介绍下普通URL的各部分组成：
<code>http://www.aspxfans.com:8080/news/index.aspboardID=5&amp;ID=24618&amp;page=1#name</code></p>
<p>一个完整的URL包括以下几部分:</p>
<ol>
<li>协议部分
该URL的协议部分为“http：”，这代表网页使用的是HTTP协议。在Internet中可以使用多种协议，如HTTP，FTP等等本例中使用的是HTTP协议。在&quot;HTTP&quot;后面的“//”为分隔符</li>
<li>域名部分
该URL的域名部分为“www.aspxfans.com”。一个URL中，也可以使用IP地址作为域名使用</li>
<li>端口部分
该URL的域名部分为“8080”。端口不是一个URL必须的部分，如果省略端口部分，将采用默认端口</li>
<li>路径部分(目录和文件)
该URL的路径部分为“/news/index.asp” 如果省略 则使用默认的文件名</li>
<li>参数部分
该URL的参数部分为“boardID=5&amp;ID=24618&amp;page=1” 参数可以允许有多个参数，参数与参数之间用“&amp;”作为分隔符。</li>
<li>锚部分(作者名)
“#”开始到最后，都是锚部分。不是必须的。</li>
</ol>
<h2 id="uri和url的区别">URI和URL的区别</h2>
<h3 id="uri">URI:</h3>
<p>URI是uniform resource identifier，统一资源标识符，用来唯一的标识一个资源。
Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的
URI一般由三部组成：
①访问资源的命名机制
②存放资源的主机名
③资源自身的名称，由路径表示，着重强调于资源。</p>
<h3 id="url">URL:</h3>
<p>URL是uniform resource locator，统一资源定位器，它是一种具体的URI，
即URL可以用来标识一个资源，而且还指明了如何locate这个资源。</p>
<p>URL是Internet上用来描述信息资源的字符串，主要用在各种WWW客户程序和服务器程序上，
特别是著名的Mosaic。
采用URL可以用一种统一的格式来描述各种信息资源，包括文件、
服务器的地址和目录等。URL一般由三部组成：
①协议(或称为服务方式)
②存有该资源的主机IP地址(有时也包括端口号)
③主机资源的具体地址。如目录和文件名等</p>
<h3 id="urn">URN:</h3>
<p>uniform resource name，统一资源命名，是通过名字来标识资源，
比如:mailto:java-net@java.sun.com。</p>
<h3 id="区别">区别：</h3>
<p>URI是以一种抽象的，高层次概念定义统一资源标识，而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。笼统地说，每个 URL 都是 URI，但不一定每个 URI 都是 URL。这是因为 URI 还包括一个子类，即统一资源名称 (URN)，它命名资源但不指定如何定位资源。上面的 mailto、news 和 isbn URI 都是 URN 的示例。</p>
<h2 id="http之请求消息request">HTTP之请求消息Request</h2>
<p><strong>请求行（request line）、请求头部（header）、空行和请求数据四个部分组成。</strong></p>
<ol>
<li>
<p>请求行，用来说明请求类型,要访问的资源以及所使用的HTTP版本</p>
</li>
<li>
<p>请求头部，紧接着请求行（即第一行）之后的部分，用来说明服务器要使用的附加信息</p>
</li>
<li>
<p>空行，请求头部后面的空行是必须的</p>
</li>
<li>
<p>请求数据也叫主体，可以添加任意的其他数据。</p>
</li>
</ol>
<h2 id="http之响应消息response">HTTP之响应消息Response</h2>
<p><strong>HTTP响应也由四个部分组成，分别是：状态行、消息报头、空行和响应正文。</strong></p>
<ol>
<li>
<p>状态行，由HTTP协议版本号， 状态码， 状态消息 三部分组成。</p>
</li>
<li>
<p>消息报头，用来说明客户端要使用的一些附加信息</p>
</li>
<li>
<p>空行，消息报头后面的空行是必须的</p>
</li>
<li>
<p>响应正文，服务器返回给客户端的文本信息。</p>
</li>
</ol>
<h2 id="http之状态码">HTTP之状态码</h2>
<p>状态代码有三位数字组成，第一个数字定义了响应的类别，共分五种类别:</p>
<ul>
<li>1xx：指示信息&ndash;表示请求已接收，继续处理</li>
<li>2xx：成功&ndash;表示请求已被成功接收、理解、接受</li>
<li>3xx：重定向&ndash;要完成请求必须进行更进一步的操作</li>
<li>4xx：客户端错误&ndash;请求有语法错误或请求无法实现</li>
<li>5xx：服务器端错误&ndash;服务器未能实现合法的请求</li>
</ul>
<blockquote>
<p>常见状态码：</p>
</blockquote>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback">200 OK                        //客户端请求成功
400 Bad Request               //客户端请求有语法错误，不能被服务器所理解
401 Unauthorized              //请求未经授权，这个状态代码必须和WWW-Authenticate报头域一起使用 
403 Forbidden                 //服务器收到请求，但是拒绝提供服务
404 Not Found                 //请求资源不存在，eg：输入了错误的URL
500 Internal Server Error     //服务器发生不可预期的错误
503 Server Unavailable        //服务器当前不能处理客户端的请求，一段时间后可能恢复正常

</code></pre></td></tr></table>
</div>
</div><p><a href="http://www.runoob.com/http/http-status-codes.html">更多状态码</a></p>
<h2 id="http请求方法">HTTP请求方法</h2>
<p>根据HTTP标准，HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法： <strong>GET, POST 和 HEAD方法。</strong>
HTTP1.1新增了五种请求方法：<strong>OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。</strong></p>
<ul>
<li>GET     请求指定的页面信息，并返回实体主体。</li>
<li>HEAD     类似于get请求，只不过返回的响应中没有具体的内容，用于获取报头</li>
<li>POST     向指定资源提交数据进行处理请求（例如提交表单或者上传文件）。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。</li>
<li>PUT     从客户端向服务器传送的数据取代指定的文档的内容。</li>
<li>DELETE      请求服务器删除指定的页面。</li>
<li>CONNECT     HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。</li>
<li>OPTIONS     允许客户端查看服务器的性能。</li>
<li>TRACE     回显服务器收到的请求，主要用于测试或诊断。</li>
</ul>
<h2 id="http工作原理">HTTP工作原理</h2>
<p>HTTP协议定义Web客户端如何从Web服务器请求Web页面，以及服务器如何把Web页面传送给客户端。HTTP协议采用了<code>请求/响应模型</code>。客户端向服务器发送一个请求报文，请求报文包含请求的<strong>方法、URL、协议版本、请求头部和请求数据。<strong>服务器以一个状态行作为响应，响应的内容包括</strong>协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。</strong></p>
<ol>
<li>
<p>客户端连接到Web服务器
一个HTTP客户端，通常是浏览器，与Web服务器的HTTP端口（默认为80）
建立一个TCP套接字连接。例如，http://www.baidu.com。</p>
</li>
<li>
<p>发送HTTP请求
通过TCP套接字，客户端向Web服务器发送一个文本的请求报文，
一个请求报文由请<code>求行、请求头部、空行和请求数据</code>4部分组成。</p>
</li>
<li>
<p>服务器接受请求并返回HTTP响应
Web服务器解析请求，定位请求资源。服务器将资源复本写到TCP套接字，
由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。</p>
</li>
<li>
<p>释放连接TCP连接
若connection 模式为close，则服务器主动关闭TCP连接，
客户端被动关闭连接，释放TCP连接;若connection 模式为keepalive，则该连接会保持一段时间，在该时间内可以继续接收请求;</p>
</li>
<li>
<p>客户端浏览器解析HTML内容
客户端浏览器首先解析状态行，查看表明请求是否成功的状态代码。
然后解析每一个响应头，响应头告知以下为若干字节的HTML文档和文档的字符集。
客户端浏览器读取响应数据HTML，根据HTML的语法对其进行格式化，并在浏览器窗口中显示</p>
</li>
</ol>
<blockquote>
<p>例如：在浏览器地址栏键入URL，按下回车之后会经历以下流程：</p>
</blockquote>
<ol>
<li>浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;</li>
<li>解析出 IP 地址后，根据该 IP 地址和默认端口 80，和服务器建立TCP连接;</li>
<li>浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求，该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;</li>
<li>服务器对浏览器请求作出响应，并把对应的 html 文本发送给浏览器;</li>
<li>释放 TCP连接;</li>
<li>浏览器将该 html 文本并显示内容;</li>
</ol>
<h2 id="get和post请求的区别">GET和POST请求的区别</h2>
<h3 id="get请求">GET请求:</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback">GET /books/?sex=man&amp;name=Professional HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
注意最后一行是空行
</code></pre></td></tr></table>
</div>
</div><h3 id="post请求">POST请求:</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback">POST / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive

name=Professional%20Ajax&amp;publisher=Wiley
</code></pre></td></tr></table>
</div>
</div><h3 id="提交">提交</h3>
<p>GET提交，
请求的数据会附在URL之后（就是把数据放置在HTTP协议头中），
以?分割URL和传输数据，多个参数用&amp;连接；例 如：login.action?name=hyddd&amp;password=idontknow&amp;verify=%E4%BD%A0 %E5%A5%BD。
如果数据是英文字母/数字，原样发送，如果是空格，转换为+，如果是中文/其他字符，则直接把字符串用BASE64加密，
得出如： %E4%BD%A0%E5%A5%BD，其中％XX中的XX为该符号以16进制表示的ASCII。
POST提交：把提交的数据放置在是HTTP包的包体中。上文示例中红色字体标明的就是实际的传输数据</p>
<p><strong>因此，GET提交的数据会在地址栏中显示出来，而POST提交，地址栏不会改变</strong></p>
<ol>
<li>
<p>传输数据的大小：
首先声明：HTTP协议没有对传输的数据大小进行限制，
HTTP协议规范也没有对URL长度进行限制。</p>
</li>
<li>
<p>安全性
POST的安全性要比GET的安全性高。比如：通过GET提交数据，
用户名和密码将明文出现在URL上，因为(1)登录页面有可能被浏览器缓存；
(2)其他人查看浏览器的历史纪录，那么别人就可以拿到你的账号和密码了，
除此之外，使用GET提交数据还可能会造成Cross-site request forgery攻击</p>
</li>
<li>
<p>Http get,post,soap协议都是在http上运行的
Http协议定义了很多与服务器交互的方法，最基本的有4种，分别是GET,POST,PUT,DELETE. 一个URL地址用于描述一个网络上的资源，而HTTP中的GET, POST, PUT, DELETE就对应着对这个资源的查，改，增，删4个操作。 我们最常见的就是GET和POST了。GET一般用于获取/查询资源信息，而POST一般用于更新资源信息.</p>
</li>
</ol>
<h3 id="get和post的区别">GET和POST的区别</h3>
<ol>
<li>
<p>GET提交的数据会放在URL之后，以?分割URL和传输数据，参数之间以&amp;相连，如EditPosts.aspx?name=test1&amp;id=123456. POST方法是把提交的数据放在HTTP包的Body中.</p>
</li>
<li>
<p>GET提交的数据大小有限制（因为浏览器对URL的长度有限制），而POST方法提交的数据没有限制.</p>
</li>
<li>
<p>GET方式需要使用Request.QueryString来取得变量的值，而POST方式通过Request.Form来获取变量的值。</p>
</li>
<li>
<p>ET方式提交数据，会带来安全问题，比如一个登录页面，通过GET方式提交数据时，用户名和密码将出现在URL上，如果页面可以被缓存或者其他人可以访问这台机器，就可以从历史记录获得该用户的账号和密码.</p>
</li>
</ol>
<h2 id="有状态的web应用">有状态的WEB应用</h2>
<p>HTTP 协议是无状态的。换句话说，在你的各次请求之间，服务器是不会保留你的 “状态” 信息。
每一次请求都被认为是一次全新的请求，不同的请求之间并不知道对方的存在.这种” 无状态性 “使得 HTTP 和互联网都是 “去中心化” 的，不会轻易被人掌控。</p>
<p>web 开发者常用的实现 “有状态” 体验的技术手段,主要包括：</p>
<ol>
<li>会话（ session ）</li>
<li>Cookies</li>
<li>异步 javascript 调用（ AJAX ）</li>
</ol>
<h3 id="会话session">会话（session）</h3>
<p>人们可以把这个无状态的HTTP 协议通过某种方式保持状态。
在客户端（一般就是指浏览器）的帮助下，HTTP 的行为会让人觉得它会在客户端与服务器之间维护一个有状态的连接，尽管实际并没有。达到这种效果的一个办法就是， 服务器在发送响应数据给客户端的时候带一个唯一的令牌（英文叫 token，就是一串数）。随后不论何时客户端向服务器发起请求的时候都把这个令牌附加在后面，让服务器能够辨识这个客户端。在 web 开发领域我们把这个来回传递的令牌叫做会话标识符（ session identifier ）。</p>
<p>这种在客户端与服务器之间传递会话 id的机制，能让服务器创建一种各次请求之间的持续连接状态。Web 开发人员利用这种人造的状态，来构建复杂的应用程序。即使这样，每一个请求严格上来说还是无状态的，各次请求之间并不知道彼此的存在。</p>
<p>这种人造状态，会有几个后果。第一，必须检查每个请求，查看它是否包含会话标识符。第二，如果请求有会话标识符，也就是有一个会话 id，服务器必须检查每一个会话 id ，确保这些会话 id 是没有过期的，也就是服务器需要维护一些关于如何处理会话过期，如何存储会话数据的规则。第三，服务器要基于这个会话 id 取出这个会话的数据。最后，服务器要根据取出的会话数据重新创建应用程序的状态（ 比如，一个请求对应的 HTML )，然后将其作为响应返回给客户端。</p>
<p>这就意味着服务器必须非常辛勤的工作，来模拟这个有状态的用户体验。每一个请求都会有一个独立的响应，哪怕这次的响应跟前一个响应没有任何区别。
举个例子，如果你登录到 Facebook 上，服务器会给你一个响应，生成你看到的主页。这个响应是一个十分复杂的 HTML 页面。Facebook 的服务器会把页面上所有照片和留言的赞和评论都组合起来，然后显示在你的时间线上。生成这样一个页面的成本非常高。现在，如果你点了某个照片下面的” 赞 “链接，理论上，Facebook 会重新生成整个页面，它会把你赞过的照片的被赞数加 1，然后把整个 HTML 作为响应返回给你，尽管除了这个赞数以外大部分内容都没有改变。 庆幸的是，实际中 Facebook 使用 Ajax 代替了全页面刷新。不然的话，刷新一个页面会花费很长时间。</p>
<p>服务器使用了很多先进的技术来优化会话和实现安全机制，不过这些话题都超出了本书的范围，暂且放下。现在我们来聊一个常用的存储会话信息的方法: 浏览器 cookie 。</p>
<h3 id="cookies">Cookies</h3>
<p>cookie 就是在一个请求/响应周期内，服务器发送给客户端（通常就是浏览器），并存储在客户端的一段数据。Cookies 或者 HTTP cookies，就是存储在浏览器里包含着会话信息的小文件。
默认情况下，大部分浏览器的 cookies 都是启用的。当你第一次访问一个网站的时候，服务器会给你发送会话信息并将其存储在你本地电脑浏览器的 cookie 里。要注意的是真正的会话数据是存在服务器上的。在客户端发起每一个请求的时候，服务器就会比对客户端的 cookie 和服务器上的会话数据，用来标识当前的会话。通过这种方法，当你再次访问同一个网站的时候，服务器就会通过 cookie 和里面的信息来认出你的会话。
<strong>会话数据是由服务器生成并存储在服务器上，会话 id 以 cookie 的形式发送到客户端上。</strong></p>
<h3 id="ajax">AJAX</h3>
<p>AJAX 是”异步 javascript 和 XML “ 的简称（ Asynchronous JavaScript and XML ）。它的主要特点就是允许浏览器发送请求和处理响应的时候不用刷新整个页面。
举个例子，如果你登录到 Facebook 上，服务器会给你一个响应，生成你看到的主页。 这个响应是一个十分复杂的 HTML 页面。Facebook 的服务器会把各种信息组合起来，显示在你的时间线上。在前面的讨论中，我们知道，为每一个请求都重新生成一次页面的成本是非常高的（记住，你的每一个动作，点个链接，提交个表单，都会发起一个新的请求）。
当使用 AJAX 的时候，所有客户端发送的请求都是异步的，就是说页面不会刷新。
AJAX 请求就像是普通请求：发送到服务器的请求依然跟普通请求一样有着一个 HTTP 请求该有的所有组成部分，并且服务器处理 AJAX 请求的方法跟处理普通请求也是一样的。唯一不同就是，不是通过浏览器刷新来处理响应，而通常由客户端的一些 javascript 代码来处理。</p>
<h2 id="https安全">HTTPS安全</h2>
<ol>
<li>(安全的HTTP)
在客户端和服务器互相发送请求和响应的时候，所有的请求和响应里的信息都是通过明文字符串发送的。如果一个恶意的黑客连接到同一网络，他就可以利用数据包嗅探技术来读取来回发送的消息。
正如我们已知道的，请求可以包含会话 id ，它唯一地标识你到服务器之间的联系，所以如果别人复制了这个会话 id ，他们可以手动创建到服务器的请求，伪装成你的客户端，甚至都不需要你的用户名和密码就可以自动登陆。</li>
</ol>
<p>这种情况就需要安全的 HTTP 也就是 HTTPS 来帮忙啦。通过 HTTPS 访问资源的时候，通常以 https:// 开头而不是 http:// ，而且通常在边上都会有个小锁子的图标：</p>
<p>通过 HTTPS 发送的请求和响应在发送前都会被加密。这意味着如果一个恶意的黑客监听 HTTP 通信，他得到的信息都是加密的和无用的。HTTPS 通过一个叫做 TLS 的加密协议来加密消息。在 TLS 开发完成前，早期 HTTPS 使用 SSL （ Secure Sockets Layer ）。这些加密协议在加密数据之前，需要先使用证书来与远程服务器进行通信来交换安全密钥。</p>
<ol start="2">
<li>同源策略（ Same-origin policy ）
同源策略是一个重要的概念，它允许来自同一站点的资源进行互相访问而不受限制，但是会阻止其他不同站点对文档/资源的访问。换句话说它可以阻止另一个站点通过脚本来操纵本站点的文档。
<strong>同源的文档必须有相同的协议，主机名和端口号。</strong></li>
</ol>
<p>举个例子，http://www.test.com/aboutus.html 上的 HTML 文档可以嵌入 <a href="http://www.test.com/fancy.js">http://www.test.com/fancy.js</a> 这个 javascript 文件，因为它们是同源的，有相同的协议，主机名和端口号(默认的 80) 。
反过来说，这就意味着 <a href="http://www.test.com">http://www.test.com</a> 上的文档不能嵌入 <a href="http://www.example.com">http://www.example.com</a> 上的文档，因为它们不是同源的。
同源策略是防范会话劫持的重要手段，并作为 web 应用安全的基石。
同源策略涉及的是访问文件内容，而不是链接，你可以随意链接到任何 URL。
虽然这样很安全，但是有时 web 开发人员需要进行跨域的内容访问就会很麻烦，所以就有了跨域资源共享技术CORS 。</p>
<ol start="3">
<li>
<p>跨域资源共享技术 CORS
CORS是一种机制，允许我们绕过同源策略，从一个域名向另一个域名的资源发起请求。CORS的原理是添加新的 HTTP头部，来对一些域名授权，那这些域名就可以发起对本页面资源的请求。</p>
</li>
<li>
<p>会话劫持（ Session Hijacking ）
会话在维持 HTTP 的状态上扮演着重要的角色。我们也知道会话 id 作为一个唯一的令牌来唯一标识一个会话。通常，会话 id 是作为 cookie 存储在计算机上的一个随机字符串. 会话 id 随着每一个到服务器的请求被送往服务器用于唯一标识这个会话。
事实上，这也就是很多 web 应用的用户认证系统所在做的事情，当用户的用户名和密码匹配之后，会话 id 会存储在用户的浏览器里，这样他们的下一个请求就不用重新认证了。</p>
</li>
</ol>
<p>不幸的是，如果一个攻击者拿到了这个会话 id ，他就会跟用户共享这一个会话，同时也就能访问这个 web 应用了。在会话劫持攻击中，用户根本意识不到一个攻击者甚至不用知道她的用户名和密码就可以访问她的会话了。</p>
<ol start="5">
<li>会话劫持的对策</li>
</ol>
<ul>
<li>重置会话。也就是对于一个用户认证系统来说，一次成功的登录包括验证旧的会话 id 和生成一个新的会话id完成此步骤后，在下一个请求里，会要求受害者进行身份验证。然后会话 id 就会改变，这样攻击者就无法访问到这个会话了。很多网站都采取这种办法，当用户在进行敏感操作的时候保证用户身份的正确性，比如给信用卡充值或者删除账户的时候。</li>
<li>给会话设置过期时间。那些不会过期的会话给了攻击者太多的时间去伪装成一个合法用户。如果设置了过期时间，比如 30 分钟，这样一来攻击者就不会那么从容的进行攻击了。</li>
<li>整站使用 HTTPS 把攻击者能得到会话 id 的可能性降至最低。</li>
</ul>
<ol start="6">
<li>跨站脚本攻击 (XSS)
当你允许用户输入的 HTML 和 javascript 在你自己的网站上直接显示的时候，就有可能遭受这种攻击。</li>
</ol>
<p>如果服务器端对于用户的输入不做任何无害处理的话，这些内容就会注入到网页的内容中去，然后浏览器就会解释执行这些 HTML 和 javascript 代码。
恶意用户可以使用 HTML 和 javascript 代码对服务器或者以后访问这个页面的用户发起毁灭性的攻击。举个例子，一个攻击者可以使用 javascript 代码去获取所有在他之后访问这个页面的用户的会话 id ，然后伪装成其他用户。而这一切都发生在受害者一无所知的情况下。而且要注意的是，这种攻击也能绕过同源策略，因为这段恶意代码是存在于当前这个网站上的。</p>
<blockquote>
<p>跨站脚本攻击的解决方案:</p>
</blockquote>
<ul>
<li>
<p>总是对用户输入的内容做无害处理。消除有问题的输入，比如script标签，或者使用一个更安全的输入格式，比如 Markdown，这样就可以阻止 HTML 和 javascript 同时出现在用户的输入里。</p>
</li>
<li>
<p>在显示之前转义用户输入的所有数据.如果你需要用户能够输入 HTML 和 javascript 代码，那么当你显示这些输入内容的时候要确保它们被正确转义，这样浏览器就不会把它们当做代码给执行了。</p>
</li>
</ul>
<blockquote>
<h2 id="推荐">推荐：</h2>
</blockquote>
<p>前端之http状态码：https://my.oschina.net/liuyongfov/blog/747731
HTTP协议及相关知识: <a href="https://xifengxx.github.io/2016/03/03/HTTP%E5%8D%8F%E8%AE%AE%E7%9F%A5%E5%A4%9A%E5%B0%91/">https://xifengxx.github.io/2016/03/03/HTTP%E5%8D%8F%E8%AE%AE%E7%9F%A5%E5%A4%9A%E5%B0%91/</a>
网络协议基础知识:http://blog.csdn.net/shenxin870409/article/details/40000183
HTTP协议详解: <a href="http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html">http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html</a></p>
    </div>

    <div class="post-copyright">
  <p class="copyright-item">
    <span class="item-title">文章作者</span>
    <span class="item-content">even</span>
  </p>
  <p class="copyright-item">
    <span class="item-title">上次更新</span>
    <span class="item-content">
        2017-10-16
        
    </span>
  </p>
  
  
</div>
<footer class="post-footer">
      <div class="post-tags">
          <a href="/tags/http/">HTTP</a>
          <a href="/tags/%E8%BD%AC%E8%BD%BD%E6%96%87%E7%AB%A0/">转载文章</a>
          </div>
      <nav class="post-nav">
        <a class="prev" href="/post/htmlcss/%E5%B1%82%E5%8F%A0%E9%A1%BA%E5%BA%8F%E4%B8%8E%E5%A0%86%E6%A0%88%E4%B8%8A%E4%B8%8B%E6%96%87/">
            <i class="iconfont icon-left"></i>
            <span class="prev-text nav-default">层叠顺序与堆栈上下文</span>
            <span class="prev-text nav-mobile">上一篇</span>
          </a>
        <a class="next" href="/post/linux/linux%E7%B3%BB%E7%BB%9F%E5%8F%91%E8%A1%8C%E7%89%88/">
            <span class="next-text nav-default">Linux系统发行版</span>
            <span class="next-text nav-mobile">下一篇</span>
            <i class="iconfont icon-right"></i>
          </a>
      </nav>
    </footer>
  </article>
        </div>
        

  

  

      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="social-links">
      <a href="mailto:your@email.com" class="iconfont icon-email" title="email"></a>
      <a href="http://localhost:1313" class="iconfont icon-stack-overflow" title="stack-overflow"></a>
      <a href="http://localhost:1313" class="iconfont icon-twitter" title="twitter"></a>
      <a href="http://localhost:1313" class="iconfont icon-facebook" title="facebook"></a>
      <a href="http://localhost:1313" class="iconfont icon-linkedin" title="linkedin"></a>
      <a href="http://localhost:1313" class="iconfont icon-google" title="google"></a>
      <a href="http://localhost:1313" class="iconfont icon-github" title="github"></a>
      <a href="http://localhost:1313" class="iconfont icon-weibo" title="weibo"></a>
      <a href="http://localhost:1313" class="iconfont icon-zhihu" title="zhihu"></a>
      <a href="http://localhost:1313" class="iconfont icon-douban" title="douban"></a>
      <a href="http://localhost:1313" class="iconfont icon-pocket" title="pocket"></a>
      <a href="http://localhost:1313" class="iconfont icon-tumblr" title="tumblr"></a>
      <a href="http://localhost:1313" class="iconfont icon-instagram" title="instagram"></a>
      <a href="http://localhost:1313" class="iconfont icon-gitlab" title="gitlab"></a>
      <a href="http://localhost:1313" class="iconfont icon-bilibili" title="bilibili"></a>
  <a href="https://zhouxiaoxin.gitee.io/index.xml" type="application/rss+xml" class="iconfont icon-rss" title="rss"></a>
</div>

<div class="copyright">
  <span class="power-by">
    由 <a class="hexo-link" href="https://gohugo.io">Hugo</a> 强力驱动
  </span>
  <span class="division">|</span>
  <span class="theme-info">
    主题 - 
    <a class="theme-link" href="https://github.com/olOwOlo/hugo-theme-even">Even</a>
  </span>

  <div class="busuanzi-footer">
    <span id="busuanzi_container_site_pv"> 本站总访问量 <span id="busuanzi_value_site_pv"><img src="/img/spinner.svg" alt="spinner.svg"/></span> 次 </span>
      <span class="division">|</span>
    <span id="busuanzi_container_site_uv"> 本站总访客数 <span id="busuanzi_value_site_uv"><img src="/img/spinner.svg" alt="spinner.svg"/></span> 人 </span>
  </div>

  <span class="copyright-year">
    &copy; 
    2018 - 
    2022
    <span class="heart">
      <i class="iconfont icon-heart"></i>
    </span>
    <span class="author">even</span>
  </span>
</div>
    </footer>

    <div class="back-to-top" id="back-to-top">
      <i class="iconfont icon-up"></i>
    </div>
  </div>
  
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/slideout@1.0.1/dist/slideout.min.js" integrity="sha256-t+zJ/g8/KXIJMjSVQdnibt4dlaDxc9zXr/9oNPeWqdg=" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.1.20/dist/jquery.fancybox.min.js" integrity="sha256-XVLffZaxoWfGUEbdzuLi7pwaUJv1cecsQJQqGLe7axY=" crossorigin="anonymous"></script>



<script type="text/javascript" src="/js/main.min.2517c0eb67172a0bae917de4af59b10ca2531411a009d4c0b82f5685259e5771.js"></script>








</body>
</html>
